package DataStorage;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.criterion.Restrictions;

import HibernateSQLite.java.model.Coupes;

public class CoupesDAOHibernate extends
		GenericDAOHibernate<Coupes, Long, ICoupesDAO> implements ICoupesDAO {

	@SuppressWarnings("unchecked")
	public boolean isExist(String OP, long InformationLigne_id) {
		try {
			List<Coupes> list = getSession()
					.createCriteria(Coupes.class)
					.add(Restrictions.eq("OP", OP))
					.add(Restrictions.eq("InformationLigne_id",
							InformationLigne_id)).list();
			if (!list.isEmpty()) {
				return true;
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}

		return false;
	}

	@SuppressWarnings("unchecked")
	public boolean isExistInformationLigne_id(long InformationLigne_id) {
		try {
			List<Coupes> list = getSession()
					.createCriteria(Coupes.class)
					.add(Restrictions.eq("InformationLigne_id",
							InformationLigne_id)).list();

			if (!list.isEmpty()) {
				return true;
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
		return false;
	}

	@SuppressWarnings("unchecked")
	public Coupes getCoupes(String OP, long InformationLigne_id) {
		try {
			List<Coupes> list = getSession()
					.createCriteria(Coupes.class)
					.add(Restrictions.eq("OP", OP))
					.add(Restrictions.eq("InformationLigne_id",
							InformationLigne_id)).list();

			for (Coupes c : list) {
				return c;
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public List<Coupes> getListCoupes(long InformationLigne_id) {
		try {
			List<Coupes> list = getSession()
					.createCriteria(Coupes.class)
					.add(Restrictions.eq("InformationLigne_id",
							InformationLigne_id)).list();

			return list;
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
		return null;
	}

	@Override
	public List<String> getListOP(long InformationLigne_id) {
		try {
			List<Coupes> list = this.getListCoupes(InformationLigne_id);
			List<String> listOP = new ArrayList<String>();
			for (Coupes c : list) {
				listOP.add(c.getOP());
			}
			return listOP;
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
		return null;
	}

	@Override
	public List<String> getListCoupe(long InformationLigne_id) {
		try {
			List<Coupes> list = this.getListCoupes(InformationLigne_id);
			List<String> listCoupe = new ArrayList<String>();
			for (Coupes c : list) {
				listCoupe.add(c.getCoupe());
			}
			return listCoupe;
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
		return null;

	}

	@Override
	public void saveCoupes(List<String> OP, List<String> coupe,
			long InformationLigne_id) {
		try{
			getSession();
			Coupes c = null;
			int sizeOP = OP.size();
			int sizeCoupe = coupe.size();
			if (sizeOP == sizeCoupe) {
				String[] arr_OP = (String[]) OP.toArray(new String[sizeOP]);
				String[] arr_coupe = (String[]) coupe
						.toArray(new String[sizeCoupe]);

				// String[][] arr_codageChemin = new String[2][sizeOP];
				for (int i = 0; i < sizeOP; i++) {
					if (!this.isExist(arr_OP[i], InformationLigne_id)) {
						c = new Coupes();
						c.setOP(arr_OP[i]);
						c.setCoupe(arr_coupe[i]);
						c.setInformationLigne_id(InformationLigne_id);
						// DB operation
						getSession().save(c);
					}
				}
			} else {
				System.out
						.println("Erreur d'op�ration,OP SIZE != Coupe SIZE ,r�-entrer les donn�es s'il vous pla�t !");
			}

			this.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}	
	}

	public void deleteCoupes(long InformationLigne_id) {
		if (this.isExistInformationLigne_id(InformationLigne_id)) {
			List<Coupes> listCoupes = getListCoupes(InformationLigne_id);
			this.deleAll(listCoupes);
		}
	}

	public static void main(String[] args) {
		List<String> OP = Arrays.asList("100", "110", "120", "130", "140");
		List<String> coupe = Arrays.asList("C1M", "C2M", "C3D,C3M,C3F",
		 "C4D,C4F", "C5M");
		long InformationLigne_id = 1333;
		//String OP = "130";
		CoupesDAOHibernate c = new CoupesDAOHibernate();
		 c.saveCoupes(OP, coupe, InformationLigne_id);
		// c.deleteCoupes(infoLinge);
		//boolean isexist = c.isExist(OP, InformationLigne_id);
		//System.out.println(isexist);
	}

}
